home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / utils / disk-man / mtools-3.000 / mtools-3 / mtools-3.0 / msdos.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-09  |  4.9 KB  |  172 lines

  1. #ifndef MTOOLS_MSDOS_H
  2. #define MTOOLS_MSDOS_H
  3.  
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <stdio.h>
  7.  
  8. /*
  9.  * msdos common header file
  10.  */
  11.  
  12. #define MAX_SECTOR    8192           /* largest sector size */
  13. #define MDIR_SIZE    32        /* MSDOS directory entry size in bytes*/
  14. #define MAX_CLUSTER    8192        /* largest cluster size */
  15. #define MAX_PATH    128        /* largest MSDOS path length */
  16. #define MAX_DIR_SECS    64        /* largest directory (in sectors) */
  17. #define MSECTOR_SIZE    msector_size
  18.  
  19. #define NEW        1
  20. #define OLD        0
  21.  
  22. #define _WORD(x) ((unsigned char)(x)[0] + (((unsigned char)(x)[1]) << 8))
  23. #define _DWORD(x) (_WORD(x) + (_WORD((x)+2) << 16))
  24.  
  25. #define DELMARK ((char) 0xe5)
  26.  
  27. struct directory {
  28.     char name[8];            /* file name */
  29.     char ext[3];            /* file extension */
  30.     unsigned char attr;        /* attribute byte */
  31.     unsigned char Case;        /* case of short filename */
  32.     unsigned char reserved[9];    /* ?? */
  33.     unsigned char time[2];        /* time stamp */
  34.     unsigned char date[2];        /* date stamp */
  35.     unsigned char start[2];        /* starting cluster number */
  36.     unsigned char size[4];        /* size of the file */
  37. };
  38.  
  39. #define EXTCASE 0x10
  40. #define BASECASE 0x8
  41.  
  42. #define FILE_SIZE(dir)  (_DWORD((dir)->size))
  43. #define START(dir) (_WORD((dir)->start))
  44.  
  45. static inline void set_dword(unsigned char *data, unsigned long value)
  46. {
  47.     data[3] = (value >> 24) & 0xff;
  48.     data[2] = (value >> 16) & 0xff;
  49.     data[1] = (value >>  8) & 0xff;
  50.     data[0] = (value >>  0) & 0xff;
  51. }
  52.  
  53. static inline void set_word(unsigned char *data, unsigned short value)
  54. {
  55.     data[1] = (value >>  8) & 0xff;
  56.     data[0] = (value >>  0) & 0xff;
  57. }
  58.  
  59.  
  60. /*
  61.  *        hi byte     |    low byte
  62.  *    |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0|
  63.  *      | | | | | | | | | | | | | | | | |
  64.  *      \   7 bits    /\4 bits/\ 5 bits /
  65.  *         year +80      month     day
  66.  */
  67. #define    DOS_YEAR(dir) (((dir)->date[1] >> 1) + 1980)
  68. #define    DOS_MONTH(dir) (((((dir)->date[1]&0x1) << 3) + ((dir)->date[0] >> 5)))
  69. #define    DOS_DAY(dir) ((dir)->date[0] & 0x1f)
  70.  
  71. /*
  72.  *        hi byte     |    low byte
  73.  *    |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0|
  74.  *      | | | | | | | | | | | | | | | | |
  75.  *      \  5 bits /\  6 bits  /\ 5 bits /
  76.  *         hour      minutes     sec*2
  77.  */
  78. #define    DOS_HOUR(dir) ((dir)->time[1] >> 3)
  79. #define    DOS_MINUTE(dir) (((((dir)->time[1]&0x7) << 3) + ((dir)->time[0] >> 5)))
  80. #define    DOS_SEC(dir) (((dir)->time[0] & 0x1f) * 2)
  81.  
  82. #ifndef linux
  83. #define BOOTSIZE 512
  84. #else
  85. #define BOOTSIZE 256
  86. #endif
  87.  
  88. struct bootsector {
  89.     unsigned char jump[3];        /* 0  Jump to boot code */
  90.     char banner[8];            /* 3  OEM name & version */
  91.     unsigned char secsiz[2];    /* 11 Bytes per sector hopefully 512 */
  92.     unsigned char clsiz;        /* 13 Cluster size in sectors */
  93.     unsigned char nrsvsect[2];    /* 14 Number of reserved (boot) sectors */
  94.     unsigned char nfat;        /* 16 Number of FAT tables hopefully 2 */
  95.     unsigned char dirents[2];    /* 17 Number of directory slots */
  96.     unsigned char psect[2];        /* 19 Total sectors on disk */
  97.     unsigned char descr;        /* 21 Media descriptor=first byte of FAT */
  98.     unsigned char fatlen[2];    /* 22 Sectors in FAT */
  99.     unsigned char nsect[2];        /* 24 Sectors/track */
  100.     unsigned char nheads[2];    /* 26 Heads */
  101.     unsigned char nhs[4];        /* 28 number of hidden sectors */
  102.     unsigned char bigsect[4];    /* 32 big total sectors */
  103.     unsigned char physdrive;    /* 36 physical drive ? */
  104.     unsigned char reserved;        /* 37 reserved */
  105.     unsigned char dos4;        /* 38 dos > 4.0 diskette */
  106.     unsigned char serial[4];           /* 39 serial number */
  107.     char label[11];            /* 43 disk label */
  108.     char fat_type[8];        /* 54 FAT type */
  109.  
  110.     unsigned char res_2m;        /* 62 reserved by 2M */
  111.     unsigned char CheckSum;        /* 63 2M checksum (not used) */
  112.     unsigned char fmt_2mf;        /* 64 2MF format version */
  113.     unsigned char wt;        /* 65 1 if write track after format */
  114.     unsigned char rate_0;        /* 66 data transfer rate on track 0 */
  115.     unsigned char rate_any;        /* 67 data transfer rate on track<>0 */
  116.     unsigned char BootP[2];        /* 68 offset to boot program */
  117.     unsigned char Infp0[2];        /* 70 T1: information for track 0 */
  118.     unsigned char InfpX[2];        /* 72 T2: information for track<>0 */
  119.     unsigned char InfTm[2];        /* 74 T3: track sectors size table */
  120.     unsigned char DateF[2];        /* 76 Format date */
  121.     unsigned char TimeF[2];        /* 78 Format time */
  122.     unsigned char junk[BOOTSIZE - 80];    /* 80 remaining data */
  123. };
  124.  
  125.  
  126. #define WORD(x) (_WORD(boot->x))
  127. #define DWORD(x) (_DWORD(boot->x))
  128. #define OFFSET(x) (((char *) (boot->x)) - ((char *)(boot->jump)))
  129.  
  130.  
  131. extern struct OldDos_t {
  132.     int tracks;
  133.     int sectors;
  134.     int heads;
  135.     
  136.     int dir_len;
  137.     int cluster_size;
  138.     int fat_len;
  139.  
  140.     int media;
  141. } old_dos[];
  142.  
  143. #define FAT12 4086 /* max. number of clusters described by a 12 bit FAT */
  144.  
  145. extern const char *mversion;
  146. extern const char *mdate;
  147.  
  148. /*
  149.  * Function Prototypes
  150.  */
  151.  
  152. int ask_confirmation(char *, char *, char *);
  153. char *get_homedir(void);
  154. #define EXPAND_BUF 2048
  155. char *expand(char *, char *);
  156. char *fix_mcwd(char *);
  157. FILE *open_mcwd(char *mode);
  158.  
  159. char *get_name(char *, char *, char *mcwd);
  160. char *get_path(char *, char *, char *mcwd);
  161. char get_drive(char *, char);
  162.  
  163. int init(char drive, int mode);
  164.  
  165.  
  166.  
  167. #define MT_READ 1
  168. #define MT_WRITE 2
  169.  
  170. #endif
  171.  
  172.